package cn.iocoder.yudao.module.scrm.service.customer.customerrepository;


import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.customerrepository.CustomerRepositoryPageReqVO;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.customerrepository.CustomerRepositorySaveReqVO;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.customerrepository.DeptUseScopeByTypeReqVo;
import cn.iocoder.yudao.module.scrm.controller.admin.customer.vo.customerrepository.DeptUseScopeByTypeRespVo;
import cn.iocoder.yudao.module.scrm.dal.dataobject.customer.customerrepository.CustomerRepositoryDO;
import cn.iocoder.yudao.module.scrm.dal.dataobject.customer.customerrepository.CustomerRepositoryRuleDO;
import com.fasterxml.jackson.core.JsonProcessingException;

import javax.validation.Valid;
import java.util.List;

/**
 * 客户库 Service 接口
 *
 * @author admin
 */
public interface CustomerRepositoryService {

    /**
     * 创建客户库
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createCustomerRepository(@Valid CustomerRepositorySaveReqVO createReqVO);

    /**
     * 更新客户库
     *
     * @param updateReqVO 更新信息
     */
    void updateCustomerRepository(@Valid CustomerRepositorySaveReqVO updateReqVO);

    /**
     * 删除客户库
     *
     * @param id 编号
     */
    void deleteCustomerRepository(Integer id);

    /**
     * 获得客户库
     *
     * @param id 编号
     * @return 客户库
     */
    CustomerRepositoryDO getCustomerRepository(Integer id);

    /**
     * 获得客户库分页
     *
     * @param pageReqVO 分页查询
     * @return 客户库分页
     */
    PageResult<CustomerRepositoryDO> getCustomerRepositoryPage(CustomerRepositoryPageReqVO pageReqVO);

    // ==================== 子表（客户库规则） ====================

    /**
     * 获得客户库规则列表
     *
     * @param customerRepositoryId 关联的客户库id
     * @return 客户库规则列表
     */
    List<CustomerRepositoryRuleDO> getCustomerRepositoryRuleListByCustomerRepositoryId(Integer customerRepositoryId);

    /**
     * 获取部门的使用范围
     * @param reqVo 类型和客户库id等信息
     * @return 部门列表
     */
    List<DeptUseScopeByTypeRespVo> deptUseScopeByType(DeptUseScopeByTypeReqVo reqVo) throws JsonProcessingException;
}